package com.hardson.toolkit.swing.jbutton;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.RoundRectangle2D;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class JRoundButton extends JButton {
	private static final long serialVersionUID = 39082560987930759L;

	public static final Color BUTTON_COLOR1 = new Color(205, 255, 205);

	public static final Color BUTTON_COLOR2 = new Color(51, 154, 47);

	// public static final Color BUTTON_COLOR1 = new Color(125, 161, 237);
	// public static final Color BUTTON_COLOR2 = new Color(91, 118, 173);
	public static final Color BUTTON_FOREGROUND_COLOR = Color.WHITE;

	private boolean hover;

	public JRoundButton(final String name) {
		this.setText(name);
		this.setFont(new Font("system", Font.PLAIN, 12));
		this.setBorderPainted(false);
		this.setForeground(BUTTON_COLOR2);
		this.setFocusPainted(false);
		this.setContentAreaFilled(false);
		this.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseEntered(final MouseEvent e) {
				JRoundButton.this.setForeground(BUTTON_FOREGROUND_COLOR);
				JRoundButton.this.hover = true;
				JRoundButton.this.repaint();
			}

			@Override
			public void mouseExited(final MouseEvent e) {
				JRoundButton.this.setForeground(BUTTON_COLOR2);
				JRoundButton.this.hover = false;
				JRoundButton.this.repaint();
			}
		});
	}

	@Override
	protected void paintComponent(final Graphics g) {
		Graphics2D g2d = (Graphics2D) g.create();
		int h = this.getHeight();
		int w = this.getWidth();
		float tran = 1F;
		if (!this.hover) {
			tran = 0.3F;
		}

		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
		GradientPaint p1;
		GradientPaint p2;
		if (this.getModel().isPressed()) {
			p1 = new GradientPaint(0, 0, new Color(0, 0, 0), 0, h - 1, new Color(100, 100, 100));
			p2 = new GradientPaint(0, 1, new Color(0, 0, 0, 50), 0, h - 3,
					new Color(255, 255, 255, 100));
		} else {
			p1 = new GradientPaint(0, 0, new Color(100, 100, 100), 0, h - 1, new Color(0, 0, 0));
			p2 = new GradientPaint(0, 1, new Color(255, 255, 255, 100), 0, h - 3,
					new Color(0, 0, 0, 50));
		}
		g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, tran));
		RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, w - 1, h - 1, 20, 20);
		Shape clip = g2d.getClip();
		g2d.clip(r2d);
		GradientPaint gp = new GradientPaint(0.0F, 0.0F, BUTTON_COLOR1, 0.0F, h, BUTTON_COLOR2,
				true);
		g2d.setPaint(gp);
		g2d.fillRect(0, 0, w, h);
		g2d.setClip(clip);
		g2d.setPaint(p1);
		g2d.drawRoundRect(0, 0, w - 1, h - 1, 20, 20);
		g2d.setPaint(p2);
		g2d.drawRoundRect(1, 1, w - 3, h - 3, 18, 18);
		g2d.dispose();
		super.paintComponent(g);
	}
	// 侦察单击区域

	/*Shape shape;
	
	@Override
	public boolean contains(final int x, final int y) {
	
		// 如果按钮改变了尺寸将重新创建一个Shape
	
		if (this.shape == null || !this.shape.getBounds().equals(this.getBounds())) {
	
			this.shape = new Ellipse2D.Float(0, 0, this.getWidth(), this.getHeight());
	
		}
	
		return this.shape.contains(x, y);
	
	}*/

	public static void main(final String args[]) {
		javax.swing.JFrame f = new JFrame();
		f.setSize(new Dimension(300, 200));
		JPanel pnl = new JPanel();
		pnl.add(new JButton("原來的按鈕"));
		JRoundButton b = new JRoundButton("测试一下喽 ");
		b.setPreferredSize(new Dimension(150, 50));
		pnl.add(b);
		f.getContentPane().add(pnl);
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}